www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/rate_match.m
function e = rate_match(d,iUE,iTB,iCB) % 速率匹配实现,包括子块交织,比特收集,比特选取和凿孔 % 输入:d:速率匹配输入信息 % iUE:第iUE个用户 % iTB:第iTB个传输块 % iCB:第iCB个码块 % 输出:e:速率匹配输出 % % 参考 36.212 V8.6.0 第5.1.4节 % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-06-20 % ========================================================== global LTE_par C = LTE_par.UE_par.nCB(iTB,iUE); % 第i个用户的分块数 Qm = LTE_par.UE_par.Qm(iTB,iUE); % 第i个用户的第i个传输块使用的调制方式 nTB = LTE_par.UE_par.nCW(iUE); % 第i个用户可用TB数 nRE = LTE_par.UE_par.nRE(iUE); % 用户可用资源粒子数 rvidx = LTE_par.UE_par.rvidx(iTB,iUE); % 冗余版本号 rvidx取值为0~3 nLayer = LTE_par.UE_par.nLayer(iUE); % 第i个用户可用层数 category = LTE_par.UE_par.category; % UE终端等级 KMIMO = LTE_par.UE_par.KMIMO; % 如果PDSCH传输模式为3或4,该值取2,其他情况下取1 % 其他固定参数 M_DL_HARQ = 8; Mlimit = 8; cSubTC = 32; % 交织深度 Nsoft = [250368 1237248 1237248 1827072 3667200]; % 软信道比特总和 36.306 V9.1.0 interleaverPattern = [0 16 8 24 4 20 12 28 2 18 10 26 6 22 14 30 1 17 9 25 5 21 13 29 3 19 11 27 7 23 15 31]+1;% 子块交织器列变换样式 表5.1.4-1 % 映射到一个传输层 NL = 1 映射到2或4个传输层 NL = 2 if nLayer == 2 && nTB == 1 NL = 2; G = 2*nRE; elseif nLayer == 3 && nTB == 2 if iTB == 1 NL = 1; G = nRE; else NL = 2; G = 2*nRE; end elseif nLayer == 4 && nTB == 2 NL = 2; G = 2*nRE; else NL = 1; G = nRE; end % ===================== 子块交织 ================================== [rowD,colD] = size(d); % turbo 编码后输出矩阵大小 rSubTC = ceil(colD/cSubTC); % 确定交织矩阵的行数 nPostLeav = rSubTC*cSubTC; % 交织输出的行向量包含的数据个数 v = zeros(rowD,nPostLeav); % 存储子块交织后三流数据 % 如果输入比特数小于交织矩阵大小,则添加dummy bit if(nPostLeav) > colD ND = nPostLeav-colD; d = [NaN*ones(rowD,ND),d]; end iRow = 1; while iRow < rowD interleaverMatrix = transpose(reshape(d(iRow,:),cSubTC,rSubTC)); % 先按行优先将d放到一个矩阵中,对其转置,得到列优先放置矩阵 interleaverMatrix = interleaverMatrix(:,interleaverPattern); % 按照交织器列变换样式变换 v(iRow,:) = interleaverMatrix(:); % 按列优先顺序读取 iRow = iRow+1; end alphaPi = zeros(1,nPostLeav); for k = 1:nPostLeav t = floor((k-1)/rSubTC)+1; alphaPi(k) = mod(interleaverPattern(t)-1+cSubTC*(mod((k-1),rSubTC))+1,nPostLeav); % RSC2 路数据交织表 end alphaPi = alphaPi+1; v(iRow,:) = d(iRow,alphaPi); % disp('速率匹配的alphaPi') % disp(alphaPi) % ===================== 比特收集 =================================== circularBufLen = rowD*nPostLeav; % 循环缓冲长度 w = zeros(1,circularBufLen); w(1:nPostLeav) = v(1,:); w(nPostLeav+1:2:end) = v(2,:); w(nPostLeav+2:2:end) = v(3,:); nanPosition = isnan(w); % 记录NaN的位置 % disp('速率匹配的w') % disp(w) % ===================== 比特选取和凿孔 ============================== NIR = floor(Nsoft(category)/(KMIMO*min(M_DL_HARQ,Mlimit))); Ncb = min(floor(NIR/C),circularBufLen); GG = G/NL; % 此处G表示复值符号数 和标准中差Qm倍 gama = mod(GG,C); if iCB-1 <= C-gama-1 E = NL*Qm*floor(GG/C); else E = NL*Qm*ceil(GG/C); end e = zeros(1,E); % Matlab的第一个字符下标为1 当前RV版本从k0+1开始取值(含k0+1) k0 = rSubTC*(2*ceil(Ncb/(8*rSubTC))*rvidx+2); k = 1; j = 0; while(k<=E) if ~isnan(w(mod(k0+j,Ncb)+1)) e(k) = w(mod(k0+j,Ncb)+1); k = k+1; end j = j+1; end LTE_par.UE_par.E(iTB,iUE) = E; LTE_par.UE_par.rSubTC(iTB,iUE) = rSubTC; LTE_par.UE_par.Ncb(iTB,iUE) = Ncb; LTE_par.UE_par.turboOutputSize(iTB,iUE) = colD; LTE_par.UE_par.nanPosition{iTB,iUE} = nanPosition;